package com.zxcl.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zxcl.domain.SysUser;
import com.zxcl.dto.PageDTO;
import com.zxcl.dto.SysUserAddDTO;
import com.zxcl.dto.SysUserQueryDTO;
import com.zxcl.dto.SysUserUpdateDTO;
import com.zxcl.model.Result;
import com.zxcl.service.SysUserService;
import com.zxcl.utils.AuthUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("/sys/user")
@Api(tags = "用户管理相关接口")
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;

    @GetMapping("/info")
    @ApiOperation("查询当前用户信息")
//    @PreAuthorize(value = "hasAuthority('sys:user:info')")
    public Result<SysUser> info(){
        Long userId = AuthUtil.getUserId();
        SysUser sysUser = sysUserService.getById(userId);
        return Result.success(sysUser);
    }

    /**
     * 分页查询用户
     *
     * @PreAuthorize 是一个 Spring Security 注解，用于在方法执行之前进行权限验证。它的作用是确保只有满足指定条件的用户才能够访问被注解的方法。
     *
     * 在给定的代码片段中，@PreAuthorize(value = "hasAuthority('sys:user:page')") 表示对被注解的方法进行权限验证。具体解释如下：
     *
     * @PreAuthorize: 这个注解指示 Spring Security 在方法执行之前进行权限验证。
     * value = "hasAuthority('sys:user:page')": 这是 @PreAuthorize 注解的属性值。它使用 SpEL (Spring Expression Language) 表达式指定了权限验证的条件。
     * 在这个例子中，条件是 hasAuthority('sys:user:page')，它使用 hasAuthority() 方法来检查当前用户是否具有 sys:user:page 的权限。这意味着只有拥有 sys:user:page 权限的用户才能够访问被注解的方法。
     *
     * 注意：sys:user:page 是一个表示权限的字符串。在实际应用中，权限的命名可能会根据具体的业务需求进行定义和配置。
     */
    @GetMapping("page")
    @ApiOperation("分页查询用户")
    @PreAuthorize(value = "hasAuthority('sys:user:page')")
    public Result<?> page(PageDTO pageDTO, SysUserQueryDTO userQueryDTO){
        Page<SysUser> sysUserPage = sysUserService.loadSysUserPage(pageDTO, userQueryDTO);
        return Result.success(sysUserPage);
    }

    /**
     * 添加用户
     * @param sysUserAddDTO
     * @return
     */
    @PostMapping
    @ApiOperation("添加用户")
    @PreAuthorize(value = "hasAuthority('sys:user:save')")
    public Result<?> addSysUser(@RequestBody SysUserAddDTO sysUserAddDTO){
        int row = sysUserService.addSysUser(sysUserAddDTO);
        //执行封装的方法，返回结果
        return Result.handle(row>0);

    }


    /**
     * 编辑用户
     * @return
     */
    @GetMapping("/info/{userId}")
    @ApiOperation("根据用户ID查询用户信息")
    @PreAuthorize(value = "hasAuthority('sys:user:info')")
    public Result<SysUser> getUserById(@PathVariable Long userId){
        SysUser sysUser = sysUserService.getById(userId);
        return Result.success(sysUser);
    }

    @DeleteMapping("/{userId}")
    @ApiOperation("根据用户ID删除用户信息")
    public Result<String> deleteUserById(@PathVariable Long userId){
        boolean flag = sysUserService.removeById(userId);
        Result<String> handle = Result.handle(flag);
        return handle;
    }


    @PutMapping
    @ApiOperation("修改用户")
    @PreAuthorize(value = "hasAuthority('sys:user:update')")
    public Result<?> updateSysUser(@RequestBody SysUserUpdateDTO sysUserUpdateDTO){

        int row = sysUserService.updateSysUser(sysUserUpdateDTO);
        //执行封装的方法，返回结果
        return Result.handle(row>0);

    }


}
